Blogs
Our community blogs
-
Latest Entry
#23: Persistent Variables in the cloud (SwyxON)
Here on Swyx Forum you can find the Persistent Variables, which are variables that keep their content persistently instead of losing it once a call routing script ends. Although they keep their content in a database you are never getting in touch with a database, for you they are more or less plain VBScript variables. That makes them really easy to use.
As long as you have a database at hand which can be used for the persistent variables everything is just fine. But what if you don't have a database at hand, for example you are runing your SwyxWare in the cloud, e.g. on the SwyxON platform?
The first thought is of course that you can forget about the persistent variables again and have to look for some other solutions to keep some own content somewhere.
I know that there are some solutions in the SwyxON environment making use of some local storage on the could server, e.g. the file system or the Windows registry. While they work on the first glance ok, they all come with a severe hook: your SwyxON tenent can get at any time redeployed into a totally new VM, without any warning upfront and without any notification afterwards. It is totally up to the SwyxON platform management, which is doing such redeployments fully automated when it sees the need for it, There is no way for you to prevent that.
So, if you use some local storage on your SwyxON tenant, it can get at any time lost. In this case your own application hopefully has at least some meaningful default handling if the locally stored information isn't available anymore.
I strongly have to emphasize not to make use of any local storage (file system, registry, ...) on a SwyxON tenant for your own stuff, e.g. in call routings!
But what else possibilites are there to setup for example some simple night switches within the SwyxWare, like they are a real piece of cake when using the persistent variables?
Well, as a matter of fact you can still use the persistent variables! Don't believe me? Read on! It's more easy than you think.
All cloud systems come with the limitstion that you don't have access to local resources. The answer to this problem is always the same: keep the information somewhere else, and connect everything with web request. That's the reason why all cloud based solutions usually come with so called REST APIs, i.e. web interfaces, to be able to connect to them easily.
So the answer to our problem is:
-
use a local resource on your premise to keep the information, in this case:
an own database and own web server (IIS), along with a small ASP website, which uses the persistent variables
- use web requests from within the call routing in your SwyxON tentant to access those "distant" persistent variables
There are already a ton of examples here on Swyx Forum (Open ECR Extensions) in how to gain access to REST API based systems from within the SwyxWare call routing.And as a matter of fact the other part (the web server directly using the persistent variables) is also already available for many years. Its even well documented, the included example is a web page to be used in a web extension in your SwyxIt! client.
So all what's needed to be done is a little alteration of the provided example code. I will stick with the standard "night switch" example of the persistent variables (a simple on/off switch).
You will see that I do not hard code the name of the persistent variable "NightSwitch", just to keep this more flexible.
Lets do this step by step...
Step 1 - web server / web application using the persistent variables
1.1 You need to setup an IIS webserver on your premise and make it publicly available. There is a ton of information available on this on the internet, so I take the liberty to divert you to Google in case you need some help on how setup and configure an IIS.
1.2 You also need a database somewhere in your network. This could be an MS SQL Express Server which you can install right from the SwyxWare complete download package. In there you need to setup the persistent variables database and persistent variables table.
1.3 Setup either a web application or a virtual path within the IIS.
1.4 Store the following code as "default.asp" file into that application/virtual path. Place the "\examples\External\asp\PersistentVariables.inc" file from the persistent variable download file into the very same folder. You also need to modify the connect string (g_sPersistentVariableConnectString) right at the beginning of the code. It must reflect on how and where you have installed the persistent variables database.
Code<!-- #include file = "PersistentVariables.inc"--> <% ' configure the complete db connect string g_sPersistentVariableConnectString = _ "Provider=sqloledb;" & _ "Data Source=MY_SQL_SERVER;" & _ "Initial Catalog=" & PERSISTENT_VARIABLE_DATABASE & ";" & _ "User Id=PersistentVariables;" & _ "Password=PersistentVariables" Const PV_URL_TYPE = "type" Const PV_URL_NAME = "name" Const PV_URL_VALUE = "value" Const PV_GET = "get" Const PV_SET = "set" Const PV_TOGGLE = "toggle" Const PV_OFF = "0" Const PV_ON = "1" Dim sType, sName, sValue, cPV ' get url parameters sType = LCase(Request.QueryString(PV_URL_TYPE)) sName = Request.QueryString(PV_URL_NAME) sValue = Request.QueryString(PV_URL_VALUE) ' validate and set defaults if (sType <> PV_GET) and (sType <> PV_SET) and (sType <> PV_TOGGLE) then sType = PV_GET if (sValue <> PV_OFF) and (sValue <> PV_ON) then sValue = PV_OFF ' hint: no need to check sName/sValue for any SQL injection attempts as the persistent variables handle that themselves if sName <> "" then Set cPV = new PersistentVariable cPV.Name = sName cPV.Default = PV_OFF select case sType case PV_GET ' return current value Response.Write cPV.Value case PV_SET ' set new value cPV.Value = sValue ' return new value Response.Write cPV.Value case PV_TOGGLE ' toggle current value if cPV.Value = PV_OFF then cPV.Value = PV_ON else cPV.Value = PV_OFF end if ' return new value Response.Write cPV.Value end select Set cPV = Nothing else ' just return "0" Response.Write PV_OFF end if %>As you can see, the persistent variables still keep all database stuff away from you. It's just that they are now on the web server and not within the call routing anymore.
Step 2 - use web requestes within call routing to access persistent variable
As the persistent variables are now used on the web server and not within your SwyxWare call routing, you don't need to install them into the SwyxWare anymore.
You just need to copy & paste the following code into the Start block of your call routing rule. Furthermore you need to update the first line, where the URL_BASE is defined, by the address of your web server.CodeConst URL_BASE = "https://my-pv-domain/pv/" Const URL_GET_PV = "default.asp?type=get&name=%name%" Const URL_SET_PV = "default.asp?type=set&name=%name%&value=%value%" Const URL_TOGGLE_PV = "default.asp?type=toggle&name=%name%" Const PV_OFF = "0" Const PV_ON = "1" ''------------------------------------------------------------------- '' Name: DoWebRequest '' ============ '' '' Performs the given web request. Placeholders %name% and %value% within the '' URL will be replaced by given parameters '' '' Parameter: '' sURL url to be called, including possible placeholders %name% and %value% '' sName name of global persistent variable, i.e. "NightSwitch" '' sValue new value, "0" or "1", when setting PV. Otherwise empty string. '' '' return value: '' string new or current value of PV, "0" or "1" '' ''-------------------------------------------------------------------- Private Function DoWebRequest ( sURL, sName, sValue ) PBXScript.OutputTrace "------> DoWebRequest" PBXScript.OutputTrace "sURL = " & sURL PBXScript.OutputTrace "sName = " & sName PBXScript.OutputTrace "sValue = " & sValue Dim sReturn sReturn = PV_OFF sURL = Replace(sURL, "%name%", sName) sURL = Replace(sURL, "%value%", sValue) PBXScript.OutputTrace "sURL = " & sURL Dim oWebRequest Set oWebRequest = PBXScript.WebRequest oWebRequest.HttpVerb = HttpVerbGet oWebRequest.URL = sURL oWebRequest.AddHeader "Content-Type:application/text" Dim sResponseCode, sResponseBody sResponseCode = oWebRequest.Execute sResponseBody = Trim(oWebRequest.ResponseBody) PBXScript.OutputTrace "sResponseCode = " & sResponseCode PBXScript.OutputTrace "sResponseBody = " & sResponseBody if (sResponseBody = PV_OFF) or (sResponseBody = PV_ON) then sReturn = sResponseBody else PBXScript.OutputTrace "Unexpected response from persistent variable web server!" end if oWebRequest.Reset DoWebRequest = sReturn PBXScript.OutputTrace "sReturn = " & sReturn PBXScript.OutputTrace "<------ DoWebRequest" End Function ''------------------------------------------------------------------- '' Name: GetPersistentVariable '' ===================== '' '' Returns the value ("0" or "1") of the given (global) persistent variable. '' '' Parameter: '' sName name of global persistent variable, i.e. "NightSwitch" '' '' return value: '' string "0" or "1" '' ''-------------------------------------------------------------------- Public Function GetPersistentVariable ( sName ) PBXScript.OutputTrace "------> GetPersistentVariable" GetPersistentVariable = DoWebRequest(URL_BASE & URL_GET_PV, sName, "") PBXScript.OutputTrace "<------ GetPersistentVariable" End Function ''------------------------------------------------------------------- '' Name: SetPersistentVariable '' ===================== '' '' Sets a new value ("0" or "1") of the given (global) persistent variable and returns the new value as well again. '' '' Parameter: '' sName name of global persistent variable, i.e. "NightSwitch" '' sValue new value, "0" or "1" '' '' return value: '' string "0" or "1" '' ''-------------------------------------------------------------------- Public Function SetPersistentVariable ( sName, sValue ) PBXScript.OutputTrace "------> SetPersistentVariable" SetPersistentVariable = DoWebRequest(URL_BASE & URL_SET_PV, sName, sValue) PBXScript.OutputTrace "<------ SetPersistentVariable" End Function ''------------------------------------------------------------------- '' Name: TogglePersistentVariable '' ======================== '' '' Toggles the value/status of the given (global) persistent variable and returns the new value as well again. '' If if was previously "0" it is now "1", and vice versa. '' '' Parameter: '' sName name of global persistent variable, i.e. "NightSwitch" '' '' return value: '' string "0" or "1" '' ''-------------------------------------------------------------------- Public Function TogglePersistentVariable ( sName ) PBXScript.OutputTrace "------> TogglePersistentVariable" TogglePersistentVariable = DoWebRequest(URL_BASE & URL_TOGGLE_PV, sName, "") PBXScript.OutputTrace "<------ TogglePersistentVariable" End FunctionThe code provides three simple functions to get, set or toggle a persistent variable (on/off), i.e. the night switch.
Coming back to the night switch example in the download package of the persistent variables. Here you need to make the following modifications:
-
A.1 - Night Switch - Night Switch Manager
- Remove the "GSE Action" block, the first "Insert Script Code" block (Init NightSwitch) and the "Insert Script Code" block (Set new Status) completely.
- Within the "Say Number" Block (Current Status) you replace the current "String of digits" by= GetPersistentVariable("NightSwitch")
- Within the "Say Number" Block (New Status) you replace the current "String of digits" by= SetPersistentVariable("NightSwitch", NewStatus)
-
A.2 - Night Switch enabled call routing script
- Remove the "GSE Action" block completely.
- Replace the code in the "Insert Script Code" block byUseExit = CInt(GetPersistentVariable("NightSwitch"))
Of course two updated .rse files (NightSwitchManager_Web.rse and NightSwitchEnabledScript_Web.rse) containing these both example are included in the download link below as well.
Don't forget to update the URL_BASE constant in the first line of the code within the Start block of these examples!
Although this blog article turned out to be a litte bit lengthy, the principle behind is quite easy, as you hopefully grasped.
In future updates of the persistent variables I will also add all the above stuff directly into the download package.
In the meantime you can download everything from here:
PersistentVariables_SwyxON.zip
Enjoy!
PS: don't miss to take a look into the ECR Useful Link Collection.
- Read more...
-
- 0 comments
-
use a local resource on your premise to keep the information, in this case:
-
This post sums this great article series up. Mirjam spent quite some time to identify all those tips and to publish them here on Swyx Forum.
As the article series dates some years back there had been a couple of articles I have not re-posted again, simply because they were not valid with a current SwyxWare version anymore.
But the vast majority of the tips is still valid with current SwyxWare versions and that's why I decided to re-post them to make them available again after the old Swyx Forum went offline.
Thank you very much Mirjam for all your efforts!
- Read more...
-
- 0 comments
-
- 6
entries - 44
comments - 4787
views
Recent Entries
Latest Entry
Call Parking / Open Hold
A common feature request I have had over the years is a Call Park feature, and the usual stock reply to Can Swyx Do..... is NO! but...... of course this is software and anything is possible. I have seen a number of ways of implementing a call park feature some really clever ones that use the conference bridge facility in Swyx to some not so clever ones using analog adaptors to have live logged on extensions which are used to pick up from... sudu call park.
Before I saw the conference room version written by Tom I had a go myself and came up with this solution a couple of years ago and put it online. Recently a couple of requests came in for the source code so I thought I would upload it here.
This is another illustration of how different solutions to problems can be developed with Swyx, there is no right or wrong way, they either work or don't.So next time someone asks if "Swyx can do ......... ?", reply "No it can't, but you can" 🙂
- 6
-
- 9
entries - 0
comments - 3657
views
Recent Entries
- 9
